package com.test.tool.demo.runner.token;

import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;

import java.util.Map;

/**
 * @author 林雷
 * @date 2021年12月22日14:30:42
 **/
public abstract class AbstractToken {

    /**
     * token信息
     */
    private volatile String ehomeToken;

    /**
     * 登录的Url地址
     *
     * @return 返回登录地址
     */
    public abstract String getLoginUrl();

    /**
     * 授权码
     *
     * @return 返回授权码
     */
    public abstract String getTestAuthorization();

    /**
     * 登录参数
     *
     * @return 返回登录参数
     */
    public abstract Map<String, Object> initLoginParam() throws Exception;

    /**
     * 获取Token信息
     *
     * @return 返回token
     */
    public String getToken() throws Exception {
        if (ehomeToken == null) {
            synchronized (this) {
                if (ehomeToken == null) {
                    HttpResponse authorization = HttpUtil.createPost(getLoginUrl())
                            .header("authorization", getTestAuthorization())
                            .form(initLoginParam())
                            .execute();

                    AccessTokenVO accessTokenVO = jsonToBean(authorization.body(), AccessTokenVO.class);

                    // 空校验
                    if (accessTokenVO == null) {
                        throw new Exception("获取Token失败");
                    }

                    AccessTokenDetailVO data = accessTokenVO.getData();

                    // 返回token
                    ehomeToken = data.getTokenType().concat(" ").concat(data.getAccessToken());
                }
            }
        }
        return ehomeToken;
    }

    /**
     * 转换json
     *
     * @param json      json字符串
     * @param valueType 转换对象
     * @param <T>       泛型对象
     * @return 返回json对象
     */
    protected static <T> T jsonToBean(String json, Class<T> valueType) {
        try {
            // 转换json
            return JSONUtil.toBean(json,valueType);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
